"""
Author: yida
Time is: 2022/4/5 21:21 
this Code: hippergo-formula 定义一个函数, 根据公式计算结果
"""
import numpy as np


def function_K(x, y, lamuda, n, delta, d):
    """
    通过输入计算函数K得到结果
    :param x:参数x
    :param y:参数y
    :param lamuda:参数lamuda
    :param n:参数n
    :param delta:参数delta
    :param d:参数d
    :return:
    """
    # 转换到array, 如果x和y传入的是多维(非1维)的数组, 可直接计算得到结果
    x = np.array(x)
    y = np.array(y)
    # 将输入传入函数m计算得到结果m
    m = function_m(x, y)
    # 计算说明:
    # 1.a**b 表示a的b次方  等同于  np.power(a, b)代表a的b次方
    # 2.||x-y||^2  代表的是二范数的平方, 二范数就是欧式距离, 先平方, 然后开根号, 最后求和
    result = lamuda * (m + n) ** d + (1 - lamuda) * np.exp(-(np.sum(np.power(x - y, 2)) / 2 * delta ** 2))

    return result


def function_m(x, y):
    """
    函数m, 不知道m是如何对x, y进行操作的 暂时简单返回两数组之和
    :param x:
    :param y:
    :return:
    """
    result = np.sum(x + y)
    return result


if __name__ == '__main__':
    # ------------------------------------------------------------------
    # 输入一维
    x_inputs = 1
    y_inputs = 2
    r = function_K(x=x_inputs, y=y_inputs, lamuda=0.1, n=2, delta=1, d=2)   # 调用函数得到结果
    print("函数k的结果为:{}".format(r))

    # ------------------------------------------------------------------
    # 输入多维
    x_inputs = [1, 2, 3]
    y_inputs = [4, 5, 6]
    r = function_K(x=x_inputs, y=y_inputs, lamuda=0.1, n=2, delta=1, d=2)   # 调用函数得到结果
    print("函数K的结果为:{}".format(r))
